package com.implementacion;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.bean.BCliente;
import com.bean.BGenerico;
import com.ibatis.dao.client.DaoException;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.template.SqlMapDaoTemplate;
import com.ibatis.sqlmap.client.SqlMapExecutor;
import com.interfaces.ICliente;

public class DCliente extends SqlMapDaoTemplate implements ICliente {
    public DCliente(DaoManager daoManager) {
        super(daoManager);
    }

    public boolean validar(BGenerico cliente) {
    	
    	try{
	    	SqlMapExecutor sqlMap = getSqlMapExecutor();	
	    	Map map = new HashMap();
	    	BCliente objCliente = (BCliente)cliente;
	        map.put("P_CO_EMPR", objCliente.getEmpresa().getPk().getIdEmpresa());
	        map.put("P_CO_CLIE", objCliente.getPk().getIdCliente());
	        map.put("P_NO_CLIE", objCliente.getNomCliente());
	        sqlMap.queryForObject("VALIDAR", map);
    	}catch(SQLException e){		    
		    throw new DaoException("ERROR AL validar");
		}finally{
			return true;
		}
    }

    public BGenerico registrar(BGenerico cliente) {
    	System.out.println("DCliente - registrar");
    	try{
    		SqlMapExecutor sqlMap = getSqlMapExecutor();
	        Map map = new HashMap();
	        BCliente objCliente = (BCliente)cliente;
	        map.put("P_CO_EMPR", objCliente.getEmpresa().getPk().getIdEmpresa());
	        map.put("P_CO_CLIE", objCliente.getPk().getIdCliente());
	        map.put("P_NO_CLIE", objCliente.getNomCliente());
	        map.put("P_DE_CLIE", objCliente.getDesCliente());
	        map.put("P_CO_PAIS", objCliente.getDepartamento().getPais().getPk().getIdPais());
	        map.put("P_CO_DEPA", objCliente.getDepartamento().getPk().getIdPais());
	        sqlMap.queryForList("REGISTRA", map);
        
    	}catch(SQLException e){		    
		    throw new DaoException("ERROR AL registrar");
		}   
    	return cliente;}

    public BGenerico actualizar(BGenerico cliente) {
    	System.out.println("DCliente - actualizar");
    	try{
    		SqlMapExecutor sqlMap = getSqlMapExecutor();
	        Map map = new HashMap();
	        BCliente objCliente = (BCliente)cliente;
	        map.put("P_CO_EMPR", objCliente.getEmpresa().getPk().getIdEmpresa());
	        map.put("P_CO_CLIE", objCliente.getPk().getIdCliente());
	        map.put("P_NO_CLIE", objCliente.getNomCliente());
	        map.put("P_DE_CLIE", objCliente.getDesCliente());	        
	        map.put("P_CO_PAIS", objCliente.getDepartamento().getPais().getPk().getIdPais());
	        map.put("P_CO_DEPA", objCliente.getDepartamento().getPk().getIdDepartamento());
	        map.put("P_CO_TIPO_CLIE", objCliente.getTipoCliente().getCo_tipo_clie());
	        map.put("P_MO_FACT", objCliente.getMontoFacturacionCliente());
	        map.put("P_NU_TELF", objCliente.getTelefonoCliente());
	        map.put("P_FE_REGIS", objCliente.getFecRegistro());
	        sqlMap.queryForList("ACTUALIZA", map);
    	}catch(SQLException e){		    
		    throw new DaoException("ERROR AL actualizar");
		}
        return cliente;
    }

    public BGenerico buscar(BGenerico cliente) {
    	System.out.println("DCliente - buscar");
    	List Lista = null;
    	try{   
    		SqlMapExecutor sqlMap = getSqlMapExecutor();	        
	        Map map = new HashMap();
	        BCliente objCliente = (BCliente)cliente;
	        System.out.println(objCliente.getPk().getIdEmpresa());
	        System.out.println(objCliente.getPk().getIdCliente());
	        map.put("P_CO_EMPR", objCliente.getPk().getIdEmpresa());
	        map.put("P_CO_CLIE", objCliente.getPk().getIdCliente());
	
	        Lista = (List)sqlMap.queryForList("BUSCAR", map);
	        System.out.println(Lista.size());
	        if (Lista == null)
	            return null;
	        if (Lista.size() == 0)
	            return null;	       
	        
    	}catch(SQLException e){		    
		    throw new DaoException("ERROR AL INSETAR BCliente");
		}
        return (BGenerico)Lista.get(0);
    }

    public void eliminar(BGenerico cliente) {
    	try{
    		SqlMapExecutor sqlMap = getSqlMapExecutor();
    		BCliente objCliente = (BCliente)cliente;
	    	Map map = new HashMap();
	        map.put("P_CO_EMPR", objCliente.getPk().getIdEmpresa());
	        map.put("P_CO_CLIE", objCliente.getPk().getIdCliente());
	        sqlMap.queryForObject("ELIMINAR", map);
    	}catch(SQLException e){		    
		    throw new DaoException("ERROR AL buscar");
		}
    }

    public List listar(BGenerico cliente) {
        return null;
    }
    
    public List listar(HashMap map) {
    	System.out.println("DCliente - listar(map)");
    	Map parametros = new HashMap();
    	parametros.put("begin", map.get("begin"));
    	System.out.println(" > valor : " + map.get("begin"));
    	parametros.put("end", map.get("end"));
    	System.out.println(" > valor : " + map.get("end"));
    	System.out.println("parametros.size = " + parametros.size());
    	try{
    		SqlMapExecutor sqlMap = getSqlMapExecutor();
	        return sqlMap.queryForList("LISTA_PAGINADO_FILTRO_C", parametros);			
	    }catch(Exception e){
	    	StackTraceElement[] xx = e.getStackTrace();
	    	for(int i=0;i<xx.length;i++){
	    		System.err.println("TRAZA-ERROR : " + xx[i]);
	    	}
	    	throw new DaoException();
	    }
    }

	public List listar() {
    	System.out.println("DCliente - listar");
    	Map parametros = new HashMap();
    	try{
    		SqlMapExecutor sqlMap = getSqlMapExecutor();
	        return sqlMap.queryForList("LISTA_PAGINADO_FILTRO_C", parametros);			
	    }catch(Exception e){
	    	StackTraceElement[] xx = e.getStackTrace();
	    	for(int i=0;i<xx.length;i++){
	    		System.err.println("TRAZA-ERROR : " + xx[i]);
	    	}
	    	throw new DaoException();
	    }
    }

	public Long contarFilas() {
		Long contadorFilas = null;
    	System.out.println("DCliente - contarFilas");
    	
    	try{SqlMapExecutor sqlMap = getSqlMapExecutor();
    		contadorFilas = (Long)sqlMap.queryForObject("GET_CLIENTE_COUNT");
    		System.out.println("Numero de filas para el query GET_CLIENTE_COUNT = " + contadorFilas);
	        return contadorFilas;			
	    }catch(Exception e){
	    	StackTraceElement[] xx = e.getStackTrace();
	    	for(int i=0;i<xx.length;i++){
	    		System.err.println(xx[i]);
	    	}
	    	throw new DaoException();
	    }
	}

}
